<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>数组常用api</title>
</head>

<body>
  <script>

    //  push
    // console.log(arr1.push(1,7,8,9,{age:18},'123')) //6

    // pop
    // console.log(arr1.pop()); //1
    // console.log(arr2.pop()); //undefined

    // unshift
    // console.log(arr2.unshift(1)) //1
    // console.log(arr2.unshift(1,7,8,9,{age:18},'123')) //7

    // shift
    // console.log(arr1.shift()); //1
    // console.log(arr2.shift()); //undefined

    // splice
    // 新增
    // console.log(arr1.splice(1, 0, 3, 4, 5, 6), arr1) //[] (5) [4, 3, 4, 5, 6]
    // console.log(arr1.splice(1, -1, 3, 4, 5, 6), arr1) //[] (5) [4, 3, 4, 5, 6]
    // // 删除
    // console.log(arr1.splice(1, 2)) // [3, 4]
    // console.log(arr1.splice(-1, 3)) // [6]
    // // 替换
    // console.log(arr1.splice(1, 2, 10, 10), arr1) // [3, 4]  [4, 10, 10, 5, 6]

    //  // slice
    //  const arr = [1, 2, 3, 4, 5]
    //  console.log(arr.slice()) //[1, 2, 3, 4, 5] 为空默认返回全部数据
    //  console.log(arr.slice(2,3)) // [3]
    //  console.log(arr.slice(3,2)) // []
    //  console.log(arr.slice(-3,3)) // [3]

    // concat
    // const arr1 = [4,[2],1]
    // const arr2 = [1,[2]]
    // console.log(arr1.concat(arr2)) //[4,[2],1,1,[2]]
    // console.log(arr1.concat(2,4,arr2)) //[4,[2],1,2,4,1,[2]]

    // // toString
    // const arr1 = [1,2,5,'hhh',{age:18},[1,2,{age:77},[1,2]]]
    // console.log(arr1.toString()) //1,2,5,hhh,[object Object],1,2,[object Object],1,2

    // join
    // const arr1 = [1,2,3,4]
    // console.log(arr1.join()) //1,2,3,4
    // console.log(arr1.join('-')) //1-2-3-4
    // console.log(eval(arr1.join('+'))) //10   替换成运算符可以与eval()连用

    // // reverse
    // const arr1 = [1,2,3,4]
    // console.log(arr1.reverse(),arr1) //(4) [4, 3, 2, 1] (4) [4, 3, 2, 1]

    //  sort
    // const arr1 = [1, 2, 3, 4, 11, 10, 14, 12]
    // //如果没有指明 compareFunction ，那么元素会按照转换为的字符串的诸个字符的Unicode位点进行排序
    // console.log(arr1.sort()) //[1, 10, 11, 12, 14, 2, 3, 4]  数值超时10排序无效,
    // // 如果指明了 compareFunction ，那么数组会按照调用该函数的返回值排序。即 a 和 b 是两个将要被比较的元素：
    // // 如果 compareFunction(a, b) 小于 0 ，那么 a 会被排列到 b 之前；
    // // 如果 compareFunction(a, b) 等于 0 ， a 和 b 的相对位置不变。备注： ECMAScript 标准并不保证这一行为，而且也不是所有浏览器都会遵守（例如 Mozilla 在 2003 年之前的版本）；
    // // 如果 compareFunction(a, b) 大于 0 ， b 会被排列到 a 之前。
    // // compareFunction(a, b) 必须总是对相同的输入返回相同的比较结果，否则排序的结果将是不确定的。
    // console.log(arr1.sort((a, b) => a - b)) //[1, 2, 3, 4, 10, 11, 12, 14]  升序
    // console.log(arr1.sort((a, b) => b - a)) // [14, 12, 11, 10, 4, 3, 2, 1] 降序

    // forEach
    // let arr1 = [1, 2, 3, 4]
    //   arr1.forEach((item, index, arr) => {
    //     console.log(item + ':' + index, arr)
    //   })
    //   // 1:0 (4) [1, 2, 3, 4]
    //   // 2:1 (4) [1, 2, 3, 4]
    //   // 3:2 (4) [1, 2, 3, 4]
    //   // 4:3 (4) [1, 2, 3, 4]
    //   console.log(arr1.forEach((item, index, arr) => {})) //undefined

    //   /* forEach() 遍历的范围在第一次调用 callback 前就会确定。
    //   调用 forEach 后添加到数组中的项不会被 callback 访问到。
    //   如果已经存在的值被改变，则传递给 callback 的值是 forEach()
    //   遍历到他们那一刻的值。已删除的项不会被遍历到。
    //   如果已访问的元素在迭代时被删除了（例如使用 shift()），
    //   之后的元素将被跳过
    //  */
    //  arr1.forEach((item, index, arr) => {
    //     arr1=[]
    //     console.log(item + ':' + index, arr)
    //   })
    //   // 1:0 (4) [1, 2, 3, 4]
    //   // 2:1 (4) [1, 2, 3, 4]
    //   // 3:2 (4) [1, 2, 3, 4]
    //   // 4:3 (4) [1, 2, 3, 4]
    //   console.log(arr1) //[]
    //   arr1.forEach((item, index, arr) => {
    //     arr1.push(5)
    //     console.log(item + ':' + index, arr)
    //   })
    //   // 1:0 (5) [1, 2, 3, 4, 5]
    //   // 2:1 (6) [1, 2, 3, 4, 5, 5]
    //   // 3:2 (7) [1, 2, 3, 4, 5, 5, 5]
    //   // 4:3 (8) [1, 2, 3, 4, 5, 5, 5, 5]
    //   arr1.forEach((item, index, arr) => {
    //     arr1.pop()
    //     console.log(item + ':' + index, arr)
    //   })
    //   // // 1:0 (3) [1, 2, 3]
    //   // // 2:1 (2) [1, 2]
    //   console.log(arr1) //(2) [1, 2]
    //   arr1.forEach((item, index, arr) => {
    //     arr1[index+1]=arr1[index+1]+1
    //     console.log(item + ':' + index, arr)
    //   })
    //   // 1:0 (4) [1, 3, 3, 4]
    //   // 3:1 (4) [1, 3, 4, 4]
    //   // 4:2 (4) [1, 3, 4, 5]
    //   // 5:3 (5) [1, 3, 4, 5, NaN]
    //   console.log(arr1) //(5) [1, 3, 4, 5, NaN]


    //  map
    // 在遍历中修改原数组长度不会影响map遍历次数跟forEach类似
    // const arr1 = [1,2,3,4]
    // console.log(arr1.map((item, index, arr) =>{
    //   arr1.push(2)
    //   return  item*item
    // }),arr1) //(4) [1, 4, 9, 16] (8) [1, 2, 3, 4, 2, 2, 2, 2]
    // // 二维数组无法遍历
    // const arr2 = [1,[4,6],3,4]
    // console.log(arr2.map((item, index, arr) =>{
    //   return  item*item
    // })) //(4) [1, NaN, 9, 16]

    // filter
    // const arr2 = [1,2, 3, 4]
    // console.log(arr2.filter((item, index, arr) =>item>2)) //(2) [3, 4]
    // /*filter 遍历的元素范围在第一次调用 callback 之前就已经确定了。
    // 在调用 filter 之后被添加到数组中的元素不会被 filter 遍历到。
    // 如果已经存在的元素被改变了，则他们传入 callback 的值是 filter
    // 遍历到它们那一刻的值。被删除或从来未被赋值的元素不会被遍历到。*/
    // console.log(arr2.filter((item, index, arr) =>{
    //   arr2.push(3)
    //   return item>2?true:false
    // }),arr2)  //(2) [3, 4] (8) [1, 2, 3, 4, 3, 3, 3, 3]

    // find
    // // 返回数组中第一个满足所提供测试函数的元素的值，否则返回 undefined。
    // const arr2 = [1, 2, 3, 4, 5, 6, 7]
    // console.log(arr2.find((item, index, arr) => item > 2)) //3
    // console.log(arr2.find((item, index, arr) => item > 8)) //undefined
    // console.log(arr2.find((item, index, arr) => {
    //   return item % 2 == 0 ? true : false
    // })) //2


    // findIndex
    // 数组中通过提供测试函数的第一个元素的索引。否则，返回-1
    // const arr2 = [1, 2, 3, 4, 5, 6, 7]
    // console.log(arr2.findIndex((item, index, arr) => item > 2)) //2
    // console.log(arr2.findIndex((item, index, arr) => item > 8)) //-1
    // console.log(arr2.findIndex((item, index, arr) => {
    //   return item % 2 == 0 ? true : false
    // })) //1

    // // indexOf
    // // 首个被找到的元素在数组中的索引位置; 若没有找到则返回 -1
    // const arr2 = [1, 2, 3, 4, 5, 6, 7]
    // console.log(arr2.indexOf(2,-2)) //-1
    // console.log(arr2.indexOf(2)) //1
    // console.log(arr2.indexOf(2,1)) //1

    //  // lastIndexOf
    // // 数组中该元素最后一次出现的索引，如未找到返回-1。
    // const arr2 = [1, 2, 3,2, 4, 2,5, 6, 7]
    // console.log(arr2.lastIndexOf(2,-5)) //3
    // console.log(arr2.lastIndexOf(2)) //5
    // console.log(arr2.lastIndexOf(2,1)) //1

    // includes
  //   // 如果在数组中（或 fromIndex 指定的范围中）找到了 valueToFind，则返回 true，否则返回 false。
  //   const arr2 = [1, 2, 3, 4, 5, 6, 7]
  //   console.log(arr2.includes(2, -5)) //false
  //   console.log(arr2.includes(2)) //true
  //   console.log(arr2.includes(2, 1)) //true

      // flat
      // const arr2 = [1, 2, 3, [2,3,[5]]]
      // const arr3= [2, 2,, 3, [2,3,[5]]]
      // console.log(arr2.flat()) //(6) [1, 2, 3, 2, 3, [5]]
      // console.log(arr2.flat(1)) //(6) [1, 2, 3, 2, 3, [5]]
      // console.log(arr2.flat(2)) //(6) [1, 2, 3, 2, 3, 5]
      // console.log(arr2.flat(Infinity)) //(6) [1, 2, 3, 2, 3, 5]
      // //flat() 方法会移除数组中的空项:
      // console.log(arr3.flat()) //(6) [2, 2, 3, 2, 3, [5]]


      // reduce
      // const arr=[1, 2, 3, 4]
      // console.log(
      //   arr.reduce((pre,cur,index,arr)=>{
      //     console.log(pre,cur,index,arr)
      //     return pre+cur 
      //   },0)
      // )
      // 0 1 0 (4) [1, 2, 3, 4]
      // 1 2 1 (4) [1, 2, 3, 4]
      // 3 3 2 (4) [1, 2, 3, 4]
      // 6 4 3 (4) [1, 2, 3, 4]
      // 10


      // every
      // const arr = [1, 2, 3, 4]
      // // 判断数组中的数据是否全部小于5
      // console.log(arr.every((item,index,arr)=>{
      //   return item<5?true:false
      // })) //true


       // some
       const arr = [1, 2, 3, 4]
      // 判断数组中的数据是否有大于3的值
      console.log(arr.some((item,index,arr)=>{
        return item>3?true:false
      })) //true
  </script>
</body>

</html>